/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

/**
 *
 * @author Mike
 */
@Entity
@Table(name = "SOLICITUD")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Solicitud.findAll", query = "SELECT s FROM Solicitud s"),
    @NamedQuery(name = "Solicitud.findSolicitudBySolicitante", query = "SELECT s FROM Solicitud s WHERE s.idSolicitante = :idSolicitante AND s.estado <> :estado ORDER BY s.idSolicitud"),
    @NamedQuery(name = "Solicitud.findSolicitudByGerenciaAsignadora", query = "SELECT s FROM Solicitud s WHERE s.gerenciaAsignadora = :idGerencia AND s.estado = :estado ORDER BY s.idSolicitud"),
    @NamedQuery(name = "Solicitud.findSolicitudByGerenciaAprobadora", query = "SELECT s FROM Solicitud s WHERE s.gerenciaAprobadora = :idGerencia AND s.estado = :estado"),
    @NamedQuery(name = "Solicitud.findSolicitudByEjecutor", query = "SELECT s FROM Solicitud s WHERE s.idEjecutor = :idEjecutor AND s.estado = :estado ORDER BY s.idSolicitud"),
    @NamedQuery(name = "Solicitud.findSolicitudByIdSolicitudAndGerenciaAprobadora", query = "SELECT s FROM Solicitud s WHERE s.idSolicitud = :idSolicitud AND s.gerenciaAprobadora = :idGerencia"),
    @NamedQuery(name = "Solicitud.findSolicitudByIdSolicitudAndGerenciaAsignadora", query = "SELECT s FROM Solicitud s WHERE s.idSolicitud = :idSolicitud AND s.gerenciaAsignadora = :idGerencia"),
    @NamedQuery(name = "Solicitud.findByIdSolicitud", query = "SELECT s FROM Solicitud s WHERE s.idSolicitud = :idSolicitud"),
    @NamedQuery(name = "Solicitud.findByDescripcion", query = "SELECT s FROM Solicitud s WHERE s.descripcion = :descripcion"),
    @NamedQuery(name = "Solicitud.findByEstado", query = "SELECT s FROM Solicitud s WHERE s.estado = :estado"),
    @NamedQuery(name = "Solicitud.findByIdSolicitante", query = "SELECT s FROM Solicitud s WHERE s.idSolicitante = :idSolicitante"),
    @NamedQuery(name = "Solicitud.findByIdEjecutor", query = "SELECT s FROM Solicitud s WHERE s.idEjecutor = :idEjecutor"),
    @NamedQuery(name = "Solicitud.findByIdGerencia", query = "SELECT s FROM Solicitud s WHERE s.gerenciaAprobadora = :idGerencia"),
    @NamedQuery(name = "Solicitud.findByFechaSolicitud", query = "SELECT s FROM Solicitud s WHERE s.fechaSolicitud = :fechaSolicitud"),
    @NamedQuery(name = "Solicitud.findByFechaAprobacion", query = "SELECT s FROM Solicitud s WHERE s.fechaAprobacion = :fechaAprobacion"),
    @NamedQuery(name = "Solicitud.findByFechaAsignacion", query = "SELECT s FROM Solicitud s WHERE s.fechaAsignacion = :fechaAsignacion"),
    @NamedQuery(name = "Solicitud.findSolciitudByGerencia", query = "SELECT s FROM Solicitud s WHERE s.idSolicitante.idUsuario IN ( SELECT u.idUsuario FROM Usuario u WHERE u.gerencia = :idGerencia )  ORDER BY s.idSolicitud"),
    @NamedQuery(name = "Solicitud.findSolicitudByIdAndGerencia", query = "SELECT s FROM Solicitud s WHERE s.idSolicitante.idUsuario IN ( SELECT u.idUsuario FROM Usuario u WHERE u.gerencia = :idGerencia ) AND s.idSolicitud = :idSolicitud"),
    @NamedQuery(name = "Solicitud.findByIdSolicitanteAndEstadosAndAccion", query = "SELECT s FROM Solicitud s WHERE s.idSolicitante = :idSolicitante AND s.accion = :accion AND s.estado.idEstado IN :estados"),
    @NamedQuery(name = "Solicitud.countByAplicacionAccionPerfilEstados", query = "SELECT COUNT(s) FROM Solicitud s WHERE s.aplicacion = :aplicacion AND s.accion = :accion AND s.perfil = :perfil AND s.estado.idEstado IN :estados")
})
public class Solicitud extends EntidadBase implements Serializable {

    @Column(name = "ACCION")
    private Short accion;
    @JoinColumn(name = "USUARIO_APP", referencedColumnName = "ID_USUARIO_APLICACION")
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private UsuariosPorAplicaciones usuarioApp;
    @JoinColumn(name = "PERFIL", referencedColumnName = "ID_PERFIL")
    @ManyToOne
    private Perfil perfil;
    @JoinColumn(name = "GERENCIA_APROBADORA", referencedColumnName = "ID_GERENCIA")
    @ManyToOne(optional = false)
    private Gerencia gerenciaAprobadora;
    @JoinColumn(name = "GERENCIA_ASIGNADORA", referencedColumnName = "ID_GERENCIA")
    @ManyToOne
    private Gerencia gerenciaAsignadora;
    @Size(max = 1500)
    @Column(name = "COMENTARIOS")
    private String comentarios;
    @Size(max = 1000)
    @Column(name = "OBSERVACIONES")
    private String observaciones;
    @JoinColumn(name = "APLICACION", referencedColumnName = "ID_APLICACION")
    @ManyToOne(optional = false)
    private Aplicacion aplicacion;
    @Basic(optional = false)
    @Column(name = "ACTIVO")
    private short activo;
    @JoinColumn(name = "ESTADO", referencedColumnName = "ID_ESTADO")
    @ManyToOne(optional = false)
    private EstadosSolicitud estado;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "idSolicitud", fetch = FetchType.LAZY)
    private List<HistoricoSolicitud> historicoSolicitudList;
    @JoinColumn(name = "ID_EJECUTOR", referencedColumnName = "ID_USUARIO")
    @ManyToOne
    private Usuario idEjecutor;
    @JoinColumn(name = "ID_SOLICITANTE", referencedColumnName = "ID_USUARIO")
    @ManyToOne(optional = false)
    private Usuario idSolicitante;
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "ID_SOLICITUD")
    @SequenceGenerator(name = "seqSolicitud", sequenceName = "SOLICITUD_SEQ", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "seqSolicitud")
    private Long idSolicitud;
    @Size(max = 300)
    @Column(name = "DESCRIPCION")
    private String descripcion;
    @Basic(optional = false)
    @Column(name = "FECHA_SOLICITUD")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaSolicitud;
    @Column(name = "FECHA_APROBACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaAprobacion;
    @Column(name = "FECHA_ASIGNACION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaAsignacion;
    @Column(name = "FECHA_EJECUCION")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaEjecucion;

    public Solicitud() {
    }

    public Solicitud(Long idSolicitud) {
        this.idSolicitud = idSolicitud;
    }

    public Solicitud(Short accion, UsuariosPorAplicaciones usuarioApp, Perfil perfil, Gerencia gerenciaAprobadora, Gerencia gerenciaAsignadora, String comentarios, String observaciones, Aplicacion aplicacion, short activo, EstadosSolicitud estado, List<HistoricoSolicitud> historicoSolicitudList, Usuario idEjecutor, Usuario idSolicitante, Long idSolicitud, String descripcion, Date fechaSolicitud, Date fechaAprobacion, Date fechaAsignacion, Date fechaEjecucion) {
        this.accion = accion;
        this.usuarioApp = usuarioApp;
        this.perfil = perfil;
        this.gerenciaAprobadora = gerenciaAprobadora;
        this.gerenciaAsignadora = gerenciaAsignadora;
        this.comentarios = comentarios;
        this.observaciones = observaciones;
        this.aplicacion = aplicacion;
        this.activo = activo;
        this.estado = estado;
        this.historicoSolicitudList = historicoSolicitudList;
        this.idEjecutor = idEjecutor;
        this.idSolicitante = idSolicitante;
        this.idSolicitud = idSolicitud;
        this.descripcion = descripcion;
        this.fechaSolicitud = fechaSolicitud;
        this.fechaAprobacion = fechaAprobacion;
        this.fechaAsignacion = fechaAsignacion;
        this.fechaEjecucion = fechaEjecucion;
    }

    public Long getIdSolicitud() {
        return idSolicitud;
    }

    public void setIdSolicitud(Long idSolicitud) {
        this.idSolicitud = idSolicitud;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Date getFechaSolicitud() {
        return fechaSolicitud;
    }

    public void setFechaSolicitud(Date fechaSolicitud) {
        this.fechaSolicitud = fechaSolicitud;
    }

    public Date getFechaAprobacion() {
        return fechaAprobacion;
    }

    public void setFechaAprobacion(Date fechaAprobacion) {
        this.fechaAprobacion = fechaAprobacion;
    }

    public Date getFechaAsignacion() {
        return fechaAsignacion;
    }

    public void setFechaAsignacion(Date fechaAsignacion) {
        this.fechaAsignacion = fechaAsignacion;
    }

    public Date getFechaEjecucion() {
        return fechaEjecucion;
    }

    public void setFechaEjecucion(Date fechaEjecucion) {
        this.fechaEjecucion = fechaEjecucion;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (idSolicitud != null ? idSolicitud.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Solicitud)) {
            return false;
        }
        Solicitud other = (Solicitud) object;
        if ((this.idSolicitud == null && other.idSolicitud != null) || (this.idSolicitud != null && !this.idSolicitud.equals(other.idSolicitud))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "co.com.claro.adminSolicitudes.entity.Solicitud[ idSolicitud=" + idSolicitud + " ]";
    }

    public Usuario getIdEjecutor() {
        return idEjecutor;
    }

    public void setIdEjecutor(Usuario idEjecutor) {
        this.idEjecutor = idEjecutor;
    }

    public Usuario getIdSolicitante() {
        return idSolicitante;
    }

    public void setIdSolicitante(Usuario idSolicitante) {
        this.idSolicitante = idSolicitante;
    }

    @Override
    public String obtenerNombreClase() {
        return "Solicitud";
    }

    @XmlTransient
    public List<HistoricoSolicitud> getHistoricoSolicitudList() {
        return historicoSolicitudList;
    }

    public void setHistoricoSolicitudList(List<HistoricoSolicitud> historicoSolicitudList) {
        this.historicoSolicitudList = historicoSolicitudList;
    }

    public EstadosSolicitud getEstado() {
        return estado;
    }

    public void setEstado(EstadosSolicitud estado) {
        this.estado = estado;
    }

    public short getActivo() {
        return activo;
    }

    public void setActivo(short activo) {
        this.activo = activo;
    }

    public Aplicacion getAplicacion() {
        return aplicacion;
    }

    public void setAplicacion(Aplicacion aplicacion) {
        this.aplicacion = aplicacion;
    }

    public String getComentarios() {
        return comentarios;
    }

    public void setComentarios(String comentarios) {
        this.comentarios = comentarios;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public Short getAccion() {
        return accion;
    }

    public void setAccion(Short accion) {
        this.accion = accion;
    }

    public UsuariosPorAplicaciones getUsuarioApp() {
        return usuarioApp;
    }

    public void setUsuarioApp(UsuariosPorAplicaciones usuarioApp) {
        this.usuarioApp = usuarioApp;
    }

    public Perfil getPerfil() {
        return perfil;
    }

    public void setPerfil(Perfil perfil) {
        this.perfil = perfil;
    }

    public Gerencia getGerenciaAprobadora() {
        return gerenciaAprobadora;
    }

    public void setGerenciaAprobadora(Gerencia gerenciaAprobadora) {
        this.gerenciaAprobadora = gerenciaAprobadora;
    }

    public Gerencia getGerenciaAsignadora() {
        return gerenciaAsignadora;
    }

    public void setGerenciaAsignadora(Gerencia gerenciaAsignadora) {
        this.gerenciaAsignadora = gerenciaAsignadora;
    }

}
